perm filename INITER[NS,NS]1 blob
sn#112890 filedate 1974-07-19 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 Definitions. The file DEFS must be assembled with this file.
C00003 00003 storage allocations
C00004 00004 INITER
C00009 00005 WORD
C00013 00006 REPEAT 0
C00016 00007 SRTCOM GETCH FINISH NOLOOK NOENTR NOCORE
C00020 ENDMK
C⊗;
;Definitions. The file DEFS must be assembled with this file.
IFNDEF DEBUG <DEBUG←1>
TITLE INITER -- creater of INI.DAT file from WORDS.TXT
F←0
A←1
B←2
C←3 ;current character
D←4
E←5 ;counter and temporary AC
L←6
M←7
N←10
Q←11 ;byte pointer
R←12 ;temporary byte pointer
W←13 ;W:Z are used as LOOKUP and ENTER block
X←14
Y←15
Z←16
P←17 ;pdl pointer
;I/O channels
TI ←←0 ;text input from WORDS.TXT file
DAT←←1 ;output to INI.DAT file
; storage allocations
IFN DEBUG <
LSYM←←2000
SYM: BLOCK LSYM
>;END IFN DEBUG
DSK17: 17
SIXBIT /DSK/
0
DATCMD: IOWD 1,DATA ;dump mode command for writing INI.DAT goes here
0
NTIBUF←←2
TIBUF: BLOCK 203*NTIBUF;buffer space for reading in WORDS.TXT
IBUF: BLOCK 3 ;buffer header for reading WORDS.TXT
LPDL←←30
PDL: BLOCK LPDL ;pushdown list
DIFILE: SIXBIT /WORDS/
SIXBIT /NON/
0↔0
DOFILE: SIXBIT /INI/
SIXBIT /DAT/
277000,,0
0
COMMON: BLOCK INDLOC-COMLOC ;COMMON WORDS ARE COLLECTED HERE TEMPORARILY
0 ;COMMON WORD LIST HEADER
LINKS: BLOCK INDLOC-COMLOC
;INITER
INITER: RESET
MOVE P,[IOWD LPDL,PDL]
INIT TI,0 ;CHANNEL FOR INPUT OF WORDS.TXT
SIXBIT /DSK/
IBUF
HALT .
OPEN DAT,DSK17 ;CHANNEL FOR OUTPUT OF INI.DAT
HALT .
MOVE A,[DIFILE,,W]
BLT A,Z
LOOKUP TI,W
JRST NOLOOK
MOVE A,[DOFILE,,W]
BLT A,Z
ENTER DAT,W
JRST NOENTR
MOVEI A,TIBUF
MOVEM A,JOBFF↑
INBUF TI,NTIBUF ;SET UP INPUT BUFFER RING
IFN DEBUG,<
HRLZ W,JOBSYM↑ ;GET PTR TO SYMBOL TABLE
CAMN W,[SYM,,0] ;HAS IT BEEN MOVED?
JRST NOMOVE ;YES
HRRI W,SYM ;ADDRESS OF NEW LOC FOR SYMBOL TABLE
HRRM W,JOBSYM ;NEW PTR TO SYMBOL TABLE
HLRE X,JOBSYM ;GET LENGTH OF SYMBOL TABLE
MOVN X,X ;POSITIVE LENGTH
CAILE X,LSYM
HALT . ;SYMBOL TABLE TOO BIG
ADDI X,-1(W) ;ADDRESS OF LAST WORD
BLT W,(X) ;MOVE TABLE
NOMOVE:
>;END DEBUG
PUSHJ P,GETREC ;INPUT FILE MUST BE IN E/TV FORMAT
CAIE C,FF
JRST .-2
;WORD
SETZM DATA ;NO STORIES YET
MOVE A,[DATA,,DATA+1]
BLT A,@JOBREL↑ ;CLEAR DAT FILE ARRAY
MOVE A,[DATLOC,,DATLOC]
MOVEM A,DATA+1 ;PTR TO FIRST, LAST AND ONLY DICT ENTRY FOR NOW
MOVEI E,DATLOC+3
MOVSM E,DATA+2 ;PTR TO FIRST FREE WORDS IN .DAT FILE, .TXT FILE
MOVNI E,1(E)
HRLM E,DATCMD ;DUMP MODE COMMAND FOR WRITING INI.DAT
MOVE E,['NS',,2]
MOVEM E,DATA+3 ;VERSION NUMBER
MOVE A,[1,,1]
MOVEM A,DATA+DATLOC ;DICT PTRS FORWARD AND BACK FOR SINGLE DICT ENTRY
MOVE A,[377777,,-1]
MOVEM A,DATA+DATLOC+1 ;TEXT OF SINGLE WORD IN DICT
MOVEM A,COMMON ;ONLY COMMON WORD FOR NOW IS INFINITE
MOVSI A,-1
MOVEM A,DATA+DATLOC+2 ;MARK IT AS A NON-WORD ENTRY
MOVEI R,COMMON ;POINTER FOR DEPOSITING COMMON WORDS
MOVEI N,INDLOC-COMLOC-1 ;MAX NUMBER OF COMMON WORDS
SETZM LINKS-1 ;COMMON WORD LIST HEADER
SETZM LINKS ;ONLY ONE KEYWORD YET
WORD: PUSHJ P,GETCH ;get char from input file
CAIL C,"A" ;look for beginning of a word--do we have a letter?
CAILE C,"Z"
JRST WORD ;no
SOJL N,TOMANY ;JUMP IF TOO MANY COMMON WORDS
MOVEI E,7 ;MAX LENGTH OF COMMON WORD
HRLI R,010500 ;MAKE BYTE POINTER
WORD3: IDPB C,R
PUSHJ P,GETCH ;get next char
CAIL C,"A" ;is it a letter?
CAILE C,"Z"
JRST WORD4 ;NO
SOJG E,WORD3 ;yes--here we go loop de loop
OUTSTR [ASCIZ /COMMON WORD FOUND CONTAINING MORE THAN 7 CHARACTERS
/]
HALT .
WORD4: PUSHJ P,GETCH
CAIE C,LF ;SKIP TO LF
JRST WORD4
MOVE D,(R) ;CURRENT COMMON WORD
MOVEI B,-1 ;POINTER TO HEADER OF SORTED COMMON-WORD LIST
WORD5: MOVE A,B
MOVE B,LINKS(A) ;PTR TO NEXT WORD
CAMLE D,COMMON(B) ;RIGHT PLACE IN LIST FOR NEW WORD?
JRST WORD5 ;NO
CAMN D,COMMON(B) ;YES, IS THIS COMMON WORD ALREADY IN LIST?
JRST DUPLIC ;YES
MOVEI C,-COMMON(R) ;NUMBER OF THIS NEW COMMON WRD
MOVEM B,LINKS(C) ;MAKE THIS WORD PT TO NEXT ONE
MOVEM C,LINKS(A) ;MAKE PREVIOUS ONE POINT TO THIS ONE
JRST WORD
;REPEAT 0
REPEAT 0,<
MOVEI A,DATA+20(E) ;MAKE SURE ENOUGH ROOM TO ADD NEW ENTRY TO DICT
CAMG A,JOBREL↑ ;ENOUGH CORE?
JRST COREOK ;YES
CORE A, ;NO, GET ENOUGH
JRST NOCORE ;OOPS!
SETZM DATA(E)
MOVEI A,DATA+1(E)
HRLI A,-1(A)
BLT A,@JOBREL ;CLEAR NEW CORE
COREOK:
MOVE R,[POINT 5,DATA+1(E)] ;byte ptr for depositing text into .DAT file
;---
MOVEI C,1 ;ptr to dict list header
SORT1: MOVE D,C ;D points to prev dict word
HRRZ C,DATA(D) ;C points to next dict word
MOVEI A,1(E) ;get ptr to text of new word
MOVEI B,1(C) ;get ptr to text of old word
SORT2: MOVE M,DATA(A) ;get a word of text of new word
CAMLE M,DATA(B) ;and compare against corresponding part of old word
JRST SORT1 ;move on down keyword list
CAME M,DATA(B)
JRST SORT4 ;insert right here in list
TRNN M,1 ;keywords equal so far--at end of keyword?
AOJA A,[AOJA B,SORT2];no--get next part of each keyword
OUTSTR [ASCIZ /DUPLICATE /]
JRST WORD ;discard entry for new word
SORT4: HRLI C,(D) ;make forward/backward ptr for new dict entry
MOVEM C,DATA(E) ; and place into entry
HRRM E,DATA(D) ;make prev entry point to new one
HRLM E,DATA(C) ;make next entry point back to new one
ADDI E,2-DATA(R) ;advance free .DAT ptr beyond new entry
MOVSI A,-1
MOVEM A,DATA-1(E) ;make new entry a non-word
JRST WORD ;get next word from input file
>;END REPEAT 0
;SRTCOM GETCH FINISH NOLOOK NOENTR NOCORE
GETCH: SOSG IBUF+2
GETREC: IN TI,
JRST GETCH1
STATZ TI,20000
JRST FINISH
OUTSTR [ASCIZ /INPUT FILE ERROR./]
HALT .
GETCH1: ILDB C,IBUF+1
JUMPE C,GETCH
POPJ P,
;PUT SORTED COMMON WORDS INTO .DAT FILE ARRAY
FINISH: MOVE A,LINKS-1 ;PTR TO FIRST COMMON WORD
SETZ E,
FINIS0: MOVE B,COMMON(A) ;ACTUAL WORD
MOVEM B,DATA+COMLOC(E);STORE IN .DAT FILE ARRAY
SKIPE A,LINKS(A) ;PTR TO NEXT COMMON WORD
AOJA E,FINIS0
MOVE A,[377777,,-1]
MOVEM A,DATA+COMLOC+1(E);PUT INFINITE KEY AT END OF COMMON WORD LIST
;NOW WE MUST FILL IN THE COMMON WORD INDEX POINTERS
SETZB E,D ;D IS THE INDEX VALUE WE WILL FILL NEXT
;E POINTS TO THE CURRENT COMMON WORD
SETZ A,
FINIS2: CAIL D,2000 ;FILLED LAST INDEX SLOT YET?
JRST FINIS4 ;YES
MOVE B,A ;SAVE OLD INDEX FROM COMMON WORD
LDB A,[POINT 10,DATA+COMLOC(E),11] ;PICK UP INDEX VALUE FOR COMMON WORD
CAIN A,(B) ;DOES COMMON WORD HAVE SAME INDEX AS PREVIOUS ONE?
AOJA E,.-2 ;YES, NEXT COMMON WORD
FINIS3: CAIGE A,(D) ;SKIP IF COMMON WORD TO BE POINTED TO BY INDEX SLOTS
AOJA E,FINIS2 ;GET NEXT COMMON WORD
HRLZM E,DATA+INDLOC(D);POINT TO COMMON WORD
AOJA D,FINIS3 ;NEXT INDEX SLOT
FINIS4: OUT DAT,DATCMD ;WRITE OUT FILE
JRST FINIS1
OUTSTR [ASCIZ /OUTPUT FILE ERROR./]
HALT .
FINIS1: RELEAS DAT,
RELEAS TI,
EXIT
UUCODE: 0 ;UUOS (OF WHICH THERE ARE NONE) JSR TO HERE
OUTSTR [ASCIZ /ILLEGAL USER UUO
/]
HALT .
DUPLIC: OUTSTR [ASCIZ/DUPLICATE COMMON WORD.
/]
HALT .
TOMANY: OUTSTR [ASCIZ/TOO MANY COMMON WORDS; MUST RECOMPILE NS SYSTEM.
/]
HALT .
NOCORE: OUTSTR [ASCIZ/FAILED TO GET ENOUGH CORE.
/]
HALT .
NOLOOK: OUTSTR [ASCIZ/LOOKUP FAILED -- /]
HRRZ X,X ;GET ERROR CODE
CAILE X,MAXERR
MOVEI X,MAXERR
OUTSTR @FERROR(X)
OUTSTR [ASCIZ/.
/]
HALT .
NOENTR: OUTSTR [ASCIZ/ENTER FAILED -- /]
HRRZ X,X ;GET ERROR CODE
CAILE X,MAXERR
MOVEI X,MAXERR
OUTSTR @FERROR(X)
OUTSTR [ASCIZ/.
/]
HALT .
FERROR: [ASCIZ/NO SUCH FILE/]
[ASCIZ/ILLEGAL PPN/]
[ASCIZ/PROTECTION VIOLATION/]
[ASCIZ/FILE BUSY/]
MAXERR←←.-FERROR
[ASCIZ/BAD RETRIEVAL OR OTHER HORRIBLE ERROR/]
LIT
VAR
DATA: BLOCK DATLOC+3
0
END INITER